/*
 * Copyright (c) 2006-2021, RT-Thread Development Team
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Change Logs:
 * Date           Author       Notes
 * 2024-06-25     WangJing       the first version
 */
#include "key.h"

void key_init(void){

    GPIO_InitTypeDef GPIO_InitStruct = {0};

    /* GPIO Ports Clock Enable */
    __HAL_RCC_GPIOE_CLK_ENABLE();
    __HAL_RCC_GPIOH_CLK_ENABLE();
    __HAL_RCC_GPIOC_CLK_ENABLE();
    __HAL_RCC_GPIOA_CLK_ENABLE();
    __HAL_RCC_GPIOB_CLK_ENABLE();
    __HAL_RCC_GPIOD_CLK_ENABLE();

    /*Configure GPIO pins : PCPin PCPin PCPin PCPin */
    GPIO_InitStruct.Pin = KEY1_Pin|KEY2_Pin|KEY3_Pin|KEY4_Pin;
    GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

    /*Configure GPIO pin Output Level */
    HAL_GPIO_WritePin(ARM2_KA_GPIO_Port, ARM2_KA_Pin, GPIO_PIN_RESET);

    /*Configure GPIO pins : PEPin PEPin PEPin PEPin */
    GPIO_InitStruct.Pin = ARM2_KEY3_Pin|ARM2_SB_Pin|ARM2_KEY1_Pin|ARM2_KEY2_Pin;
    GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);

    /*Configure GPIO pin : PtPin */
    GPIO_InitStruct.Pin = ARM2_KA_Pin;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(ARM2_KA_GPIO_Port, &GPIO_InitStruct);

    /*Configure GPIO pins : PBPin PBPin PBPin PBPin */
    GPIO_InitStruct.Pin = ARM1_KEY1_Pin|ARM1_KEY2_Pin|ARM1_KEY3_Pin|ARM1_SB_Pin;
    GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

    /*Configure GPIO pin : PtPin */
    GPIO_InitStruct.Pin = ARM1_KA_Pin;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(ARM1_KA_GPIO_Port, &GPIO_InitStruct);

}

void key_KA(int index,int power){
    switch(index){
    case 0: HAL_GPIO_WritePin(ARM1_KA_GPIO_Port, ARM1_KA_Pin,(GPIO_PinState)power); break;
    case 1: HAL_GPIO_WritePin(ARM2_KA_GPIO_Port, ARM2_KA_Pin,(GPIO_PinState)power); break;
    default:
        HAL_GPIO_WritePin(ARM1_KA_GPIO_Port, ARM1_KA_Pin,(GPIO_PinState)power);
        HAL_GPIO_WritePin(ARM2_KA_GPIO_Port, ARM2_KA_Pin,(GPIO_PinState)power);
        break;
    }
}

int8_t key_scan(uint8_t index,uint8_t key_num){
    if(0 == index){
        switch(key_num){
            case 0 : return (int8_t)HAL_GPIO_ReadPin(ARM1_KEY1_GPIO_Port,ARM1_KEY1_Pin);
            case 1 : return (int8_t)HAL_GPIO_ReadPin(ARM1_KEY2_GPIO_Port,ARM1_KEY2_Pin);
            case 2 : return (int8_t)HAL_GPIO_ReadPin(ARM1_KEY3_GPIO_Port,ARM1_KEY3_Pin);
            case 3 : return (int8_t)HAL_GPIO_ReadPin(ARM1_SB_GPIO_Port,ARM1_SB_Pin);
            default : return -1;
        }
    }
    else if(1 == index){
        switch(key_num){
            case 0 : return (int8_t)HAL_GPIO_ReadPin(ARM2_KEY1_GPIO_Port,ARM2_KEY1_Pin);
            case 1 : return (int8_t)HAL_GPIO_ReadPin(ARM2_KEY2_GPIO_Port,ARM2_KEY2_Pin);
            case 2 : return (int8_t)HAL_GPIO_ReadPin(ARM2_KEY3_GPIO_Port,ARM2_KEY3_Pin);
            case 3 : return (int8_t)HAL_GPIO_ReadPin(ARM2_SB_GPIO_Port,ARM2_SB_Pin);
            default : return -1;
        }
    }
    else if(2 == index){
        switch(key_num){
            case 0 : return (int8_t)HAL_GPIO_ReadPin(KEY1_GPIO_Port,KEY1_Pin);
            case 1 : return (int8_t)HAL_GPIO_ReadPin(KEY2_GPIO_Port,KEY2_Pin);
            case 2 : return (int8_t)HAL_GPIO_ReadPin(KEY3_GPIO_Port,KEY3_Pin);
            case 3 : return (int8_t)HAL_GPIO_ReadPin(KEY4_GPIO_Port,KEY4_Pin);
            default : return -1;
        }
    }
    else {
        return -1;
    }
}

